package com.hmall.common.domain;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.Min;

/**
 * 分页查询请求对象
 * 用于封装分页查询参数，支持排序功能
 * 可转换为MyBatis-Plus的Page对象
 */
@Data
@ApiModel(description = "分页查询条件")
@Accessors(chain = true)
public class PageQuery {

    /**
     * 默认每页记录数
     */
    public static final Integer DEFAULT_PAGE_SIZE = 20;

    /**
     * 默认页码
     */
    public static final Integer DEFAULT_PAGE_NUM = 1;

    /**
     * 当前页码，最小值为1
     */
    @ApiModelProperty("页码")
    @Min(value = 1, message = "页码不能小于1")
    private Integer pageNo = DEFAULT_PAGE_NUM;

    /**
     * 每页记录数，最小值为1
     */
    @ApiModelProperty("每页数量")
    @Min(value = 1, message = "每页查询数量不能小于1")
    private Integer pageSize = DEFAULT_PAGE_SIZE;

    /**
     * 是否升序排列
     */
    @ApiModelProperty("是否升序")
    private Boolean isAsc = true;

    /**
     * 排序字段名
     */
    @ApiModelProperty("排序字段")
    private String sortBy;

    /**
     * 计算当前页的起始记录位置
     * @return 起始记录位置
     */
    public int from(){
        return (pageNo - 1) * pageSize;
    }

    /**
     * 转换为MyBatis-Plus的分页对象
     * @param orderItems 手动指定的排序项
     * @param <T> 分页数据类型
     * @return MyBatis-Plus的Page对象
     */
    public <T> Page<T> toMpPage(OrderItem... orderItems) {
        // 创建分页对象
        Page<T> page = new Page<>(pageNo, pageSize);

        // 场景1：手动指定排序项（优先级最高）
        if (orderItems != null && orderItems.length > 0) {
            for (OrderItem orderItem : orderItems) {
                page.addOrder(orderItem);
            }
            return page;
        }

        // 场景2：使用前端传递的排序字段
        if (StrUtil.isNotEmpty(sortBy)){
            OrderItem orderItem = new OrderItem();
            orderItem.setAsc(isAsc);
            orderItem.setColumn(sortBy);
            page.addOrder(orderItem);
        }

        return page;
    }

    /**
     * 转换为MyBatis-Plus的分页对象，支持默认排序
     * @param defaultSortBy 默认排序字段
     * @param isAsc 是否升序
     * @param <T> 分页数据类型
     * @return MyBatis-Plus的Page对象
     */
    public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc) {
        // 如果前端未指定排序字段，则使用默认排序
        if (StringUtils.isBlank(sortBy)){
            sortBy = defaultSortBy;
            this.isAsc = isAsc;
        }

        // 创建分页对象并设置排序
        Page<T> page = new Page<>(pageNo, pageSize);
        OrderItem orderItem = new OrderItem();
        orderItem.setAsc(this.isAsc);
        orderItem.setColumn(sortBy);
        page.addOrder(orderItem);

        return page;
    }

    /**
     * 转换为MyBatis-Plus的分页对象，默认按创建时间降序排列
     * @param <T> 分页数据类型
     * @return MyBatis-Plus的Page对象
     */
    public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {
        return toMpPage("create_time", false);
    }
}